/**
 * <pre>
 * Title: 		MessageConverter.java
 * Project: 	HP-Common
 * Type:		com.hengpeng.common.msg.agentportal.MessageConverter
 * Author:		linriqing
 * Create:	 	2007-6-14 上午11:52:24
 * Copyright: 	Copyright (c) 2007
 * Company:
 * <pre>
 */
package cn.bisoft.java.service.ext.httpclient.common;

import cn.bisoft.java.bean.message.TransMessage;

import com.hengpeng.common.exception.MessageFormatException;

/**
 * <pre>
 * 协议消息转换器接口
 * </pre>
 * @author linriqing
 * @version 1.0, 2007-6-14
 */
public interface MessageConverter
{
	/**
	 * 协议消息转换器接口默认实现的上下文名称
	 */
	public static final String CONTEXT_BEAN_NAME_MESSAGECONVERTER = "messageconverter";

	/**
	 * <pre>
	 * 交易消息包对象反序列化接口
	 * 注意：调用该接口需要实现com.hengpeng.common.msg.agentportal.MessengerDao接口，并通过Spring注入。
	 * </pre>
	 * @param xml 序列化的XML格式字符串
	 * @param transType 交易类型
	 * @return 反序列化后的交易消息包对象
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public TransMessage deserialize(String xml, int transType) throws MessageFormatException;

	/**
	 * <pre>
	 * 交易消息包对象反序列化接口
	 * 注意：调用该接口需要代理商的密码，可以调用接口parseAgentId(String)获取代理商id来事先查询到代理商密码。
	 * </pre>
	 * @param xml 序列化的XML格式字符串
	 * @param transType 交易类型
	 * @param password 代理商密码
	 * @param signType 签名算法
	 * @return 反序列化后的交易消息包对象
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public TransMessage deserialize(String xml, int transType, String password, String signType) throws MessageFormatException;

	/**
	 * <pre>
	 * 交易消息包对象反序列化接口
	 * 注意：调用该接口不会进行时间戳/消息摘要/版本的校验。
	 * </pre>
	 * @param xml 序列化的XML格式字符串
	 * @param transType 交易类型
	 * @return 反序列化后的交易消息包对象
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public TransMessage deserializeNoValid(String xml, int transType) throws MessageFormatException;

	/**
	 * <pre>
	 * 对消息包的摘要进行校验
	 * 注意：调用该接口需要实现com.hengpeng.common.msg.agentportal.MessengerDao接口，并通过Spring注入。
	 * </pre>
	 * @param xml 序列化的XML格式字符串
	 * @return 是否成功
	 */
	public boolean validDigest(String xml);

	/**
	 * <pre>
	 * 对消息包的摘要进行校验
	 * </pre>
	 * @param xml 序列化的XML格式字符串
	 * @param agentPwd 代理商密码
	 * @return 是否成功
	 */
	public boolean validDigest(String xml, String agentPwd);

	/**
	 * <pre>
	 * 交易消息包对象序列化接口
	 * 注意：调用该接口需要实现com.hengpeng.common.msg.agentportal.MessengerDao接口，并通过Spring注入。
	 * </pre>
	 * @param message 交易消息包对象
	 * @param transType 交易类型
	 * @return 序列化后的XML格式字符串
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public String serialize(TransMessage message, int transType) throws MessageFormatException;

	/**
	 * <pre>
	 * 交易消息包对象序列化接口
	 * </pre>
	 * @param message 交易消息包对象
	 * @param transType 交易类型
	 * @param password 代理商密码
	 * @param signType 签名算法
	 * @return 序列化后的XML格式字符串
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public String serialize(TransMessage message, int transType, String password, String signType) throws MessageFormatException;

	/**
	 * <pre>
	 * 交易消息包对象序列化接口
	 * 注意：调用该接口需要实现com.hengpeng.common.msg.agentportal.MessengerDao接口，并通过Spring注入。
	 * 该方法会首先查询代理商是否存在,如果不存在则使用空密码进行摘要.
	 * </pre>
	 * @param message 交易消息包对象
	 * @param transType 交易类型
	 * @return 序列化后的XML格式字符串
	 * @exception MessageFormatException 消息格式错误异常
	 */
	public String serializeNoValid(TransMessage message, int transType) throws MessageFormatException;
}
